# 命名规则
# 常数
CC := gcc
MKDIR := mkdir -p

# 内部变量
src = *.c
obj = $(subst .c,.o,$(src))

# 函数
maybe-make-dir = $(if $(wildcard $1),,$(MKDIR) $1)

# 简单扩展变量
aa := $(bb) -m
# 递归扩展变量, 每当该变量被使用，make就会重新求值
cc = $(bb) -m
bb = hello
.PHONY:var
var:
	@echo $(aa)
	@echo $(cc)

# 宏只是make用来定义变量的一种方式。一个由define创建的变量
# 会被扩展很多次，除非用在命令脚本的语境中
define create-file
	touch xxx
endef

# 变量使用通则：总是先定义变量和宏，在使用他们，尤其是在工作目标和必要条件中
# 扩展规则
# 定义    何时扩展a 何时扩展b
# a = b    立即     延后
# a ?= b   立即     延后
# a := b   立即     立即
# a += b   立即     立即或延后
# define a 立即     延后
#	b
# endef

# 工作目标专属变量 (= := ?= +=)
work_var = hello
.PHONY: test_work_var* std_var
test_work_var1: work_var += world
test_work_var1:
	@echo $(work_var)
test_work_var2:
	@echo $(work_var)

# 条件指令
# if-cond
# ...
# endif
# def ndef 不应该使用括号括住变量
# ifdef var
# ifndef var
# ifeq test
# ifneq test
# test 可以为 (a,b) 或 "a" "b"，可为双引号或单引号
# 可用在宏定义和命令脚本中

std_var:
	@echo $(MAKE_VERSION)
	@echo $(CURDIR)
	@echo $(MAKEFILE_LIST)
	@echo $(MAKECMDGOALS)